package com.market.fleamarket.service;

import com.market.fleamarket.entity.User;
import com.market.fleamarket.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.List;
import java.util.Optional;

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public User register(User user) {
        if (userRepository.findByUsername(user.getUsername()) != null) {
            throw new RuntimeException("用户名已存在");
        }
        // 默认角色
        if (user.getRole() == null || user.getRole().isEmpty()) {
            user.setRole("user");
        }
        //保存明文密码
        return userRepository.save(user);
    }

    public Optional<User> findByUsername(String username) {
        return Optional.ofNullable(userRepository.findByUsername(username));
    }

    public Optional<User> findById(Long id) {
        return userRepository.findById(id);
    }

    public User login(String username, String password) {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new RuntimeException("用户名或密码错误");
        }

        // 只进行明文密码比较
        if (!user.getPassword().equals(password)) {
            throw new RuntimeException("用户名或密码错误");
        }

        return user;
    }

    /**
     * 更新用户密码
     * @param userId 用户ID
     * @param oldPassword 原密码
     * @param newPassword 新密码
     * @return 更新后的用户对象
     * @throws RuntimeException 如果原密码不正确
     */
    public User updatePassword(Long userId, String oldPassword, String newPassword) {
        User user = userRepository.findById(userId)
                .orElseThrow(() -> new RuntimeException("用户不存在"));

        // 验证原密码（仅进行明文比较）
        if (!user.getPassword().equals(oldPassword)) {
            throw new RuntimeException("原密码不正确");
        }

        // 更新为新密码（明文）
        user.setPassword(newPassword);
        return userRepository.save(user);
    }

    /**
     * 更新用户个人信息
     * @param userId 用户ID
     * @param username 用户名
     * @param phoneNumber 电话号码
     * @return 更新后的用户对象
     */
    public User updateProfile(Long userId, String username, String phoneNumber) {
        User user = userRepository.findById(userId)
                .orElseThrow(() -> new RuntimeException("用户不存在"));

        // 更新用户名
        if (username != null && !username.isEmpty() && !username.equals(user.getUsername())) {
            // 检查是否已存在相同用户名（这个检查已在Controller层完成，这里是双重保险）
            User existingUser = userRepository.findByUsername(username);
            if (existingUser != null) {
                throw new RuntimeException("用户名已存在！");
            }
            user.setUsername(username);
        }

        // 更新电话号码
        if (phoneNumber != null) {
            user.setPhoneNumber(phoneNumber);
        }

        return userRepository.save(user);
    }

    /**
     * 获取待审核的用户列表
     * @return 待审核用户列表
     */
    public List<User> getPendingUsers() {
        return userRepository.findByStatus("pending");
    }

    /**
     * 审核通过用户
     * @param userId 用户ID
     * @return 更新后的用户对象
     */
    public User approveUser(Long userId) {
        User user = userRepository.findById(userId)
                .orElseThrow(() -> new RuntimeException("用户不存在"));
        user.setStatus("approved");
        return userRepository.save(user);
    }

    /**
     * 拒绝用户注册
     * @param userId 用户ID
     * @return 更新后的用户对象
     */
    public User rejectUser(Long userId) {
        User user = userRepository.findById(userId)
                .orElseThrow(() -> new RuntimeException("用户不存在"));
        user.setStatus("rejected");
        return userRepository.save(user);
    }

    // 登录时检查用户状态
    public User loginWithStatusCheck(String username, String password) {
        User user = login(username, password);
        if (user.getStatus() == null) {//状态字段若为空，默认approved（系统早期未考虑审核，避免老用户登陆不了）
            user.setStatus("approved");
            userRepository.save(user);
            return user;
        }

        if ("pending".equals(user.getStatus())) {
            throw new RuntimeException("您的账号正在审核中，请耐心等待");
        } else if ("rejected".equals(user.getStatus())) {
            throw new RuntimeException("您的账号未通过审核，请联系管理员");
        }

        return user;
    }

    private String hashPassword(String password) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] hash = md.digest(password.getBytes(StandardCharsets.UTF_8));
            StringBuilder hexString = new StringBuilder();
            for (byte b : hash) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
} 